<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>

    // console.log('');
    // console.log('');
    // console.log(array1.concat());
    // const obj = { a: '对象' }
    // console.log(array1.concat(obj, undefined, null, 1, '2', () => { }));
    // console.log('');
    // console.log('');
    // const arr = array1.concat()
    // arr[0] = 1
    // console.log(arr);
    // console.log(array1.concat());
    // console.log('');
    // console.log('');
    console.log('');
    console.log('');

    // const res = array.unshift('1', '2')
    // console.log(res);
    // console.log(array);
    // const array1 = ['a', 'b', 'c', '1', '2', '3'];
    // const array2 = ['a', 'b', 'c', '1', '2', '3'];


    // function Counter() {
    //   this.sum = 0;
    //   this.count = 0;
    // }






    // Counter.prototype.add = function (array) {
    //   array.map(function (entry) {
    //     console.log(this);
    //   }, this)
    // }

    // Counter.prototype.add = function (array) {
    //   array.map(function (entry) {
    //     this.sum += entry;
    //     ++this.count;
    //     console.log(this);
    //   }, this);
    // };

    // const obj = new Counter();
    // obj.add([2, 5, 9]);
    // console.log(obj.count);
    // // 3 === (1 + 1 + 1)
    // console.log(obj.sum);
    // 16 === (2 + 5 + 9)


    // const arr = [1, 2, 3]
    // const obj = {
    //   count: 2
    // }
    // arr.forEach(item => {
    //   console.log(item += obj.count);
    //   console.log(this);
    // }, obj);
    // console.log(arr);


    // const arr = [1, 2, 3]

    // arr.forEach((item, index) => {
    //   arr[index] = item + 1
    //   console.log(item);
    // });

    // console.log(arr);




    // console.log(["1", "2", "3"].map(parseInt));
    // const arr = ['a', 'b', 'c']
    // console.log(Object.keys(arr));












    // const arr = ["1", "2", "3"];
    // console.log(arr.amp(arr));




    // const newArr = arr.map(item => item = 'a')

    // console.log(arr);
    // console.log(newArr);


    // // console.log(arr.map(item => item = 'a'));
    // // console.log(arr);

















    // const Arr = ["1", "2", "3"];

    // // 在数组原型上挂载一个方法, Myap
    // Array.prototype.Myap = function (fn) {
    //   // 先判断参数是否为 function
    //   if (typeof fn !== "function") {
    //     // 如果不是 function 则抛出一个 错误信息
    //     throw new TypeError(`${fn} is not a function`);
    //   }
    //   // 创建一个空数组
    //   let newArr = [];
    //   // 利用 for 循环, 加上数组中的,
    //   // psuh 将传入的回调函数（fn）执行的返回值追加到空数组中
    //   for (let i = 0; i < this.length; i++) {
    //     // 将 this 中的每一项 当做实参, 传入 fn 中
    //     // 这里的 this 指向的是 arr
    //     // newArr.push(fn(this[i], i, this))
    //     newArr.push(fn(this[i], i, this))
    //     //     第一个参数 this[i] 也就是 数组的每一项
    //     //     第二个参数 i 也就是数组的 索引
    //     //     第三个参数 this 指的就是 原数组
    //   };
    //   // 之后返回 数组
    //   return newArr;
    // }


    // const MyapArr = Arr.Myap((item, index, arr) => {
    //   console.log(item, index, arr);
    //   return item
    // })
    // console.log('Myap', MyapArr);

    // console.log('---------------------');

    // const mapArr = Arr.map((item, index, arr) => {
    //   console.log(item, index, arr);
    //   return item
    // })
    // console.log('map', mapArr);










    // console.log(arr.Myap(item => item = 'a'));
    // console.log(arr);















    const array = [1, 2, 3];
    // const reducer = (totalizer, item, index, arr) => totalizer + item;

    // // 1 + 2 + 3 + 4
    // console.log(array.reduce(reducer));

    // // 5 + 1 + 2 + 3 + 4
    // console.log(array.reduce(reducer, 5));


    // 在数组的原型上挂载一个 MyReduce 方法 接收两个形参
    Array.prototype.MyReduce = function (reducer, initVal) {
      // 先判断 第一个 参数是否为 function
      if (typeof reducer !== "function") {
        // 如果不是 function 则抛出一个 错误信息
        throw new TypeError(`${reducer} is not a function`);
      }
      // 利用循环调用 reducer 并将返回值赋值给 initVal
      // 这样也就不难明白为啥, 需要一个累计器, 以及在 reducer 一定要有返回值
      for (let i = 0; i < this.length; i++) {
        initVal = reducer(initVal, this[i], i, this);
        // 这里的四个参数分别为
        //     第一个参数 initVal 累计器
        //     第二个参数 this[i] 也就是 数组的每一项
        //     第三个参数 i 也就是数组的 索引
        //     第四个参数 this 指的就是 原数组
      }
      // 最后返回 累计器 initVal
      return initVal
    };



    const res1 = array.MyReduce((acc, item, index, arr) => {
      console.log(acc, item, index, arr);
      return acc + item
    }, 0)
    console.log('MyReduce', res1);

    console.log('---------------');

    const res2 = array.reduce((acc, item, index, arr) => {
      console.log(acc, item, index, arr);
      return acc + item
    }, 0)
    console.log('reduce', res1);




    function fu() {

    }

    fu()

    const obj = {
      fun: function () {

      }
    }


    obj.fun()





























    // const Arr = ["1", "2", "3"];
    // Array.prototype.for_Each = function (fn) {
    //   for (var i = 0; i < this.length; i++) {
    //     fn(this[i], i, this)
    //   }
    // }

    // console.log(Arr.for_Each((item, i, arr) => {
    //   item = 'a'
    //   console.log(item, i, arr);
    // }));

    // console.log('for_Each', Arr);

    // console.log('---------------------');

    // console.log(Arr.forEach((item, i, arr) => {
    //   item = 'a'
    //   console.log(item, i, arr);
    // }));

    // console.log('forEach', Arr);
























    // const array2 = ['d', 'e', 'f'];

    // const res1 = array1.splice(-1, 2, '新增的1')
    // const res2 = array2.splice(-10, 2, '新增的2')

    // console.log(res1);
    // console.log(array1);
    // console.log('--------------------');
    // console.log(res2);
    // console.log(array2);


    // const array = [1, 2, 3, 4, 5]
    // const res = array.reverse()
    // console.log(res);
    // console.log(array);

    // const obj = {
    //   '0': '1',
    //   '1': '2',
    //   '2': '3',
    //   length: 3
    // }
    // const res1 = [].unshift.call(obj, 'a', 'b', {})

    // console.log(res1);
    // console.log(obj);


    // const obj = {
    //   length: 0,

    //   addElem: function addElem(elem) {
    //     // obj.length 自动递增
    //     // 每次添加一个元素。
    //     [].push.call(this, elem);
    //   }
    // };

    // // 让我们添加一些空对象来说明。
    // obj.addElem('a');
    // obj.addElem({});
    // obj.addElem({});
    // console.log(obj.length);
    // console.log(obj);
    // // → 2


    console.log('');
    console.log('');
  </script>
</body>

</html>
